//
// Created by Administrator on 2024/3/26.
// https://oj.youdao.com/problem/19388?from=problems/
// 自己的方法 4个正确 6个超时
// 2024.3 GESP 五级编程题2  位置:22:19
// 【GESP五级上机真题讲解23年9月-24年月3月】 https://www.bilibili.com/video/BV13jg6eDEDc/?share_source=copy_web&vd_source=039990b6433b5af9bd2905234cc47ac6
/*
B-smooth 数

【问题描述】
小杨同学想寻找一种名为 B-smooth 数的正整数。
如果一个正整数的最大质因子不超过B ，则该正整数为B-smooth 数。
小杨同学想知道，对于给定的 n和B ，有多少个不超过n的B-smooth 数。
【输入描述】
第一行包含两个正整数n，B ，含义如题面所示。
【输出描述】
输出一个非负整数，表示不超过n的B-smooth 数的数量。
【样例输入 1】
10 3
【样例输出 1】
7
 input
 373 46
 output
 246
 input
 1603 100001
 output
 1603
【样例解释】
在不超过10的正整数中，3-smooth数有{1, 2, 3, 4, 6, 8, 9}，共7个。
【数据范围】
编号 数据点占比	n	        B
1	30	    n<=1000	    1 <= B <= 1000
2	30	    n<= 10^6    n^(1/2) <= B <= 10^6
3	40	    n<= 10^6    1 <= B <= 10^6

对于全部数据，保证有 1 <= n <= 10^6 , 1 <= B <= 10^6
 * */
// 按照给定的整数n, 从1到n逐个求最大质因子, 最大质因子不超过B的计数器++
// 小于等于B的数, 最大质因子,肯定小于等于B, 直接累加就可以
// 所以从B到n遍历计算
// 如果这个数是质数, 如果大于B,就不符合条件,直接跳过

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

// 求合数的最大质因数,如果参数为质数,返回1
int maxFactor(int num,vector<bool> ps)
{
    int ret=int(sqrt(num));
//    int ret = num/2;
    for (int i = ret; i > 1; --i)
    {
        if(ps[i] && num%i==0)
            return i;
    }
    return 1;
}

vector<bool> primesList(int num)
{
    vector<bool> ps;
    ps.push_back(0);
    ps.push_back(0);
    for (int i = 2; i <=num ; ++i)
        ps.push_back(1);
    for (int i = 2; i*i <=num; ++i)
    {
        if(ps[i])
            for (int j = i+i; j <= num; j+=i)
                ps[j]=0;
    }
    return ps;
}
int main()
{
    int n=10,b=3,ret=0;
    cin>>n>>b;
    if (b>=n){
        cout<<n;
        return 0;
    }
    ret=b;
    vector<bool> primes=primesList(n);
//    cout<<maxFactor(51,primes)<<endl;
    for (int i = b+1; i <=n; ++i)
    {
        int maxF = maxFactor(i,primes);
        if(!primes[i] && maxF<=b)
        {
            ++ret;
//            cout<<i<<':'<<maxF<<endl;
        }
    }
    cout<<ret;

    return 0;
}